/** TLS reader tests.
Copyright (c) 2018 Simon Zolin
*/

#include <FFOS/test.h>
#include <FF/net/tls.h>

#define x FFTEST_BOOL


static const char tls13_clienthello_ciphers[] =
"\x13\x01\x13\x03\x13\x02\xc0\x2b\xc0\x2f\xcc\xa9\xcc\xa8\xc0\x2c"
"\xc0\x30\xc0\x13\xc0\x14\x00\x2f\x00\x35";

static const char tls13_clienthello_sessiondata[] =
"\x4e\x7d\x05\xe7\x0d\xc8\xaf\x83\xae\x85\xf9\x26\xe2\x12\x08\xff"
"\x8e\x90\xf5\x26\x8c\x9f\xca\x08\xe3\x0e\x36\x77\x75\xc3\x9b\x8a";

static const char tls13_clienthello_alpn[] =
"\x02\x68\x32\x08\x68\x74\x74\x70\x2f\x31\x2e\x31";

/*
TLS1.3 (0x7f17) Client Hello to www.google.com
Session ID: tls13_clienthello_sessiondata
Ciphers: tls13_clienthello_ciphers
ALPN: tls13_clienthello_alpn
*/
static const char tls13_clienthello[] =
"\x16\x03\x01\x02\x00\x01\x00\x01\xfc\x03\x03\xf4\x2f\x88\xe2\x26"
"\xbb\xe7\xd4\x2b\xd7\x74\x2d\xbc\x30\xf6\xf7\x8f\x02\x65\x31\x66"
"\x13\x2b\x3e\xdb\x2b\x28\x41\xfe\x4e\xd8\xef\x20\x4e\x7d\x05\xe7"
"\x0d\xc8\xaf\x83\xae\x85\xf9\x26\xe2\x12\x08\xff\x8e\x90\xf5\x26"
"\x8c\x9f\xca\x08\xe3\x0e\x36\x77\x75\xc3\x9b\x8a\x00\x1a\x13\x01"
"\x13\x03\x13\x02\xc0\x2b\xc0\x2f\xcc\xa9\xcc\xa8\xc0\x2c\xc0\x30"
"\xc0\x13\xc0\x14\x00\x2f\x00\x35\x01\x00\x01\x99\x00\x00\x00\x13"
"\x00\x11\x00\x00\x0e\x77\x77\x77\x2e\x67\x6f\x6f\x67\x6c\x65\x2e"
"\x63\x6f\x6d\x00\x17\x00\x00\xff\x01\x00\x01\x00\x00\x0a\x00\x0e"
"\x00\x0c\x00\x1d\x00\x17\x00\x18\x00\x19\x01\x00\x01\x01\x00\x0b"
"\x00\x02\x01\x00\x00\x23\x00\x00\x00\x10\x00\x0e\x00\x0c\x02\x68"
"\x32\x08\x68\x74\x74\x70\x2f\x31\x2e\x31\x00\x05\x00\x05\x01\x00"
"\x00\x00\x00\x00\x33\x00\x6b\x00\x69\x00\x1d\x00\x20\xe6\xe0\x92"
"\xee\x4d\x7e\x67\x18\x84\x59\x2d\x98\x66\xb8\x73\x21\xd1\xde\xde"
"\x04\x45\x9a\x99\x9c\xff\x29\x52\xae\x99\x21\x84\x1b\x00\x17\x00"
"\x41\x04\x4e\xb3\x0c\xea\x87\x05\xd8\x2e\x0c\x84\x0d\x7b\x5a\xcf"
"\xa6\x32\xad\x2e\x99\xcb\x61\xfb\x12\xcb\x94\x4b\x9f\x87\xdb\x84"
"\xd8\x05\xc2\x9c\x2c\x90\x30\xc9\x0f\x23\xd2\xea\x53\x31\xd5\x40"
"\xd2\x17\x58\x64\x1b\x60\x31\x28\x2d\x5f\xee\x3b\x7b\xe8\x39\x44"
"\xcc\x0e\x00\x2b\x00\x09\x08\x7f\x17\x03\x03\x03\x02\x03\x01\x00"
"\x0d\x00\x18\x00\x16\x04\x03\x05\x03\x06\x03\x08\x04\x08\x05\x08"
"\x06\x04\x01\x05\x01\x06\x01\x02\x03\x02\x01\x00\x2d\x00\x02\x01"
"\x01\x00\x15\x00\xa0\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00";

static const char tls13_serverhello_cipher[] = "\x13\x01";

static const char tls13_serverhello[] =
"\x16\x03\x03\x00\x7a\x02\x00\x00\x76\x03\x03\x37\xe2\x6e\xba\x83"
"\xad\x81\x2f\x49\x65\x2d\xd1\x11\x22\x92\x69\x6c\x73\x73\xf2\xc1"
"\x21\xdd\xac\x07\x69\x73\x61\x12\x63\xf9\xd6\x20\x4e\x7d\x05\xe7"
"\x0d\xc8\xaf\x83\xae\x85\xf9\x26\xe2\x12\x08\xff\x8e\x90\xf5\x26"
"\x8c\x9f\xca\x08\xe3\x0e\x36\x77\x75\xc3\x9b\x8a\x13\x01\x00\x00"
"\x2e\x00\x33\x00\x24\x00\x1d\x00\x20\xcd\x0e\x0b\x23\x85\x7f\xee"
"\x1c\x44\x1e\x22\x98\x7a\x46\x08\x31\x8e\x98\xc1\x0f\x11\x01\x41"
"\xc8\xe9\xed\x72\xf8\x64\x76\x3c\x65\x00\x2b\x00\x02\x7f\x17";

static void test_tls_long_rec();

int test_tls(void)
{
	FFTEST_FUNC;

	fftls tls;

	ffmem_tzero(&tls);
	fftls_input(&tls, tls13_clienthello, 10);
	x(FFTLS_RMORE == fftls_read(&tls));

	ffmem_tzero(&tls);
	fftls_input(&tls, tls13_clienthello + 1, 10);
	x(FFTLS_RERR == fftls_read(&tls));

	ffmem_tzero(&tls);
	fftls_input(&tls, tls13_clienthello, FFSLEN(tls13_clienthello));
	x(FFTLS_RCLIENT_HELLO == fftls_read(&tls));
	x(fftls_ver(&tls) == 0x0303);
	x(ffstr_eq(&tls.session_id, tls13_clienthello_sessiondata, FFSLEN(tls13_clienthello_sessiondata)));
	x(ffstr_eq(&tls.ciphers, tls13_clienthello_ciphers, FFSLEN(tls13_clienthello_ciphers)));
	x(FFTLS_RCLIENT_HELLO_SNI == fftls_read(&tls));
	x(ffstr_eqz(&tls.hostname, "www.google.com"));
	x(FFTLS_RHELLO_ALPN == fftls_read(&tls));
	x(ffstr_eq(&tls.alpn_protos, tls13_clienthello_alpn, FFSLEN(tls13_clienthello_alpn)));

	ffstr alpn;
	x(3 == fftls_alpn_next(&tls.alpn_protos, &alpn));
	x(ffstr_eqz(&alpn, "h2"));
	x(9 == fftls_alpn_next(&tls.alpn_protos, &alpn));
	x(ffstr_eqz(&alpn, "http/1.1"));
	x(0 == fftls_alpn_next(&tls.alpn_protos, &alpn));

	x(FFTLS_RDONE == fftls_read(&tls));
	x(fftls_ver(&tls) == 0x7f17);

	ffmem_tzero(&tls);
	fftls_input(&tls, tls13_serverhello, FFSLEN(tls13_serverhello));
	x(FFTLS_RSERVER_HELLO == fftls_read(&tls));
	x(fftls_ver(&tls) == 0x0303);
	x(ffstr_eq(&tls.session_id, tls13_clienthello_sessiondata, FFSLEN(tls13_clienthello_sessiondata)));
	x(ffstr_eq(&tls.ciphers, tls13_serverhello_cipher, FFSLEN(tls13_serverhello_cipher)));
	x(FFTLS_RDONE == fftls_read(&tls));
	x(fftls_ver(&tls) == 0x7f17);

	test_tls_long_rec();
	return 0;
}

// Server Hello + Certificate + Server Key Exchange + Server Hello Done
static const char tls_long_rec[] =
"\x16\x03\x03\x0c\xf6\x02\x00\x00\x51\x03\x03\x5b\xfb\xc5\xb6\x39" \
"\x53\xf5\xc4\x03\xe0\xee\xbd\xb1\x4c\x14\xfc\x1f\xf1\x8d\x83\x81" \
"\xe5\x28\xbd\xa0\x30\x5c\xe0\xa5\xd0\xd9\x61\x20\x13\x37\x00\x00" \
"\x43\x76\x7c\xaf\xa0\xee\x63\x6a\xc2\x2b\xa7\x58\x7f\x4a\xcb\xd5" \
"\x4f\xeb\x13\x01\x47\xc7\x44\x84\xfe\x8f\x1d\xe3\xc0\x28\x00\x00" \
"\x09\x00\x17\x00\x00\xff\x01\x00\x01\x00\x0b\x00\x0b\x08\x00\x0b" \
"\x05\x00\x06\x70\x30\x82\x06\x6c\x30\x82\x05\x54\xa0\x03\x02\x01" \
"\x02\x02\x10\x0c\xaf\x9c\xb2\xfd\x9b\x59\xdc\x62\xff\xfd\x17\x2b" \
"\x73\xa4\xc3\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x0b" \
"\x05\x00\x30\x5e\x31\x0b\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55" \
"\x53\x31\x15\x30\x13\x06\x03\x55\x04\x0a\x13\x0c\x44\x69\x67\x69" \
"\x43\x65\x72\x74\x20\x49\x6e\x63\x31\x19\x30\x17\x06\x03\x55\x04" \
"\x0b\x13\x10\x77\x77\x77\x2e\x64\x69\x67\x69\x63\x65\x72\x74\x2e" \
"\x63\x6f\x6d\x31\x1d\x30\x1b\x06\x03\x55\x04\x03\x13\x14\x47\x65" \
"\x6f\x54\x72\x75\x73\x74\x20\x52\x53\x41\x20\x43\x41\x20\x32\x30" \
"\x31\x38\x30\x1e\x17\x0d\x31\x38\x30\x33\x31\x35\x30\x30\x30\x30" \
"\x30\x30\x5a\x17\x0d\x31\x39\x30\x34\x31\x34\x31\x32\x30\x30\x30" \
"\x30\x5a\x30\x5a\x31\x0b\x30\x09\x06\x03\x55\x04\x06\x13\x02\x55" \
"\x41\x31\x0d\x30\x0b\x06\x03\x55\x04\x07\x13\x04\x4b\x69\x65\x76" \
"\x31\x17\x30\x15\x06\x03\x55\x04\x0a\x13\x0e\x4c\x4c\x43\x20\x53" \
"\x49\x4c\x50\x4f\x2d\x46\x4f\x4f\x44\x31\x0b\x30\x09\x06\x03\x55" \
"\x04\x0b\x13\x02\x49\x54\x31\x16\x30\x14\x06\x03\x55\x04\x03\x13" \
"\x0d\x6d\x61\x69\x6c\x2e\x66\x6f\x7a\x7a\x79\x2e\x75\x61\x30\x82" \
"\x01\x22\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01\x05" \
"\x00\x03\x82\x01\x0f\x00\x30\x82\x01\x0a\x02\x82\x01\x01\x00\xd2" \
"\x9e\x4a\xfd\x2b\xba\x33\x48\xed\x86\x42\x96\xf5\x23\x16\x4e\x2a" \
"\x0c\x1a\x36\xd6\xe2\xaf\x44\x7c\xb3\xa8\x4a\xbc\xfd\x28\xfe\x63" \
"\xc6\xa6\xf6\x14\x5c\x73\x3a\xc5\x6e\x15\xbd\xe4\x6d\xad\xfc\x07" \
"\xcd\x56\x56\xe1\x1c\x96\x5c\x5c\xa2\xf4\xc8\x73\x18\xc4\xa8\xd1" \
"\x10\x87\xfd\x5b\x5a\x39\xf3\x8b\xe8\xfd\x34\x87\x4f\x3c\x74\x19" \
"\x28\x6b\xe6\xdf\xca\x7c\xd8\x53\xd0\xe4\x45\x02\xb3\xb2\x0e\xbf" \
"\x76\x23\xde\x34\xde\x46\xba\x0b\x18\xc5\x0c\xf6\xf1\x8a\xaa\xf1" \
"\x04\x2f\x78\xea\xbe\x8b\x9b\x60\x31\x8d\x5f\x2d\x78\x54\x90\x8b" \
"\x00\xe2\xfa\x31\x58\x50\x1c\x04\x2b\x4e\x10\x1b\x05\x66\x7e\x01" \
"\xe3\x21\x04\xe0\x30\x37\xc9\x39\x65\x57\x67\xf3\xf7\x9c\x9d\x49" \
"\xcc\x3e\x00\xb6\x6c\x1a\x87\x6a\x54\x33\x04\x47\x5f\xae\x3f\x64" \
"\x32\x53\x04\x79\xe0\x76\x5e\x19\x4f\xc4\x9d\x3e\x1b\xed\x98\x17" \
"\xc4\xe9\xde\x61\xfc\x5f\x1a\xac\xa1\x57\x34\xea\xf2\x12\x8b\x78" \
"\x88\xa8\xe6\x79\xc8\x38\x23\x17\xef\xd3\x4e\x3a\x60\x59\x38\xc6" \
"\x4e\xba\x8e\xc8\x50\x56\xda\x54\x63\x29\x54\x9b\xd4\x02\x74\x73" \
"\x27\xb8\x14\xcb\x8a\x18\x11\xd3\x71\x78\xe7\x6f\x7c\xdc\x95\x02" \
"\x03\x01\x00\x01\xa3\x82\x03\x28\x30\x82\x03\x24\x30\x1f\x06\x03" \
"\x55\x1d\x23\x04\x18\x30\x16\x80\x14\x90\x58\xff\xb0\x9c\x75\xa8" \
"\x51\x54\x77\xb1\xed\xf2\xa3\x43\x16\x38\x9e\x6c\xc5\x30\x1d\x06" \
"\x03\x55\x1d\x0e\x04\x16\x04\x14\x9c\x56\x7d\x0e\xf3\x89\x59\x83" \
"\xec\xb2\x2a\x96\xf8\xcb\x35\x36\xb2\xa3\x02\x2e\x30\x81\x99\x06" \
"\x03\x55\x1d\x11\x04\x81\x91\x30\x81\x8e\x82\x0d\x6d\x61\x69\x6c" \
"\x2e\x66\x6f\x7a\x7a\x79\x2e\x75\x61\x82\x15\x6c\x79\x6e\x63\x64" \
"\x69\x73\x63\x6f\x76\x65\x72\x2e\x66\x6f\x7a\x7a\x79\x2e\x75\x61" \
"\x82\x0f\x72\x65\x6c\x61\x79\x32\x2e\x66\x6f\x7a\x7a\x79\x2e\x75" \
"\x61\x82\x0d\x6d\x65\x65\x74\x2e\x66\x6f\x7a\x7a\x79\x2e\x75\x61" \
"\x82\x0f\x72\x65\x6c\x61\x79\x31\x2e\x66\x6f\x7a\x7a\x79\x2e\x75" \
"\x61\x82\x0d\x6c\x79\x6e\x63\x2e\x66\x6f\x7a\x7a\x79\x2e\x75\x61" \
"\x82\x15\x61\x75\x74\x6f\x64\x69\x73\x63\x6f\x76\x65\x72\x2e\x66" \
"\x6f\x7a\x7a\x79\x2e\x75\x61\x82\x0f\x64\x69\x61\x6c\x69\x6e\x2e" \
"\x66\x6f\x7a\x7a\x79\x2e\x75\x61\x30\x0e\x06\x03\x55\x1d\x0f\x01" \
"\x01\xff\x04\x04\x03\x02\x05\xa0\x30\x1d\x06\x03\x55\x1d\x25\x04" \
"\x16\x30\x14\x06\x08\x2b\x06\x01\x05\x05\x07\x03\x01\x06\x08\x2b" \
"\x06\x01\x05\x05\x07\x03\x02\x30\x3e\x06\x03\x55\x1d\x1f\x04\x37" \
"\x30\x35\x30\x33\xa0\x31\xa0\x2f\x86\x2d\x68\x74\x74\x70\x3a\x2f" \
"\x2f\x63\x64\x70\x2e\x67\x65\x6f\x74\x72\x75\x73\x74\x2e\x63\x6f" \
"\x6d\x2f\x47\x65\x6f\x54\x72\x75\x73\x74\x52\x53\x41\x43\x41\x32" \
"\x30\x31\x38\x2e\x63\x72\x6c\x30\x4c\x06\x03\x55\x1d\x20\x04\x45" \
"\x30\x43\x30\x37\x06\x09\x60\x86\x48\x01\x86\xfd\x6c\x01\x01\x30" \
"\x2a\x30\x28\x06\x08\x2b\x06\x01\x05\x05\x07\x02\x01\x16\x1c\x68" \
"\x74\x74\x70\x73\x3a\x2f\x2f\x77\x77\x77\x2e\x64\x69\x67\x69\x63" \
"\x65\x72\x74\x2e\x63\x6f\x6d\x2f\x43\x50\x53\x30\x08\x06\x06\x67" \
"\x81\x0c\x01\x02\x02\x30\x75\x06\x08\x2b\x06\x01\x05\x05\x07\x01" \
"\x01\x04\x69\x30\x67\x30\x26\x06\x08\x2b\x06\x01\x05\x05\x07\x30" \
"\x01\x86\x1a\x68\x74\x74\x70\x3a\x2f\x2f\x73\x74\x61\x74\x75\x73" \
"\x2e\x67\x65\x6f\x74\x72\x75\x73\x74\x2e\x63\x6f\x6d\x30\x3d\x06" \
"\x08\x2b\x06\x01\x05\x05\x07\x30\x02\x86\x31\x68\x74\x74\x70\x3a" \
"\x2f\x2f\x63\x61\x63\x65\x72\x74\x73\x2e\x67\x65\x6f\x74\x72\x75" \
"\x73\x74\x2e\x63\x6f\x6d\x2f\x47\x65\x6f\x54\x72\x75\x73\x74\x52" \
"\x53\x41\x43\x41\x32\x30\x31\x38\x2e\x63\x72\x74\x30\x09\x06\x03" \
"\x55\x1d\x13\x04\x02\x30\x00\x30\x82\x01\x05\x06\x0a\x2b\x06\x01" \
"\x04\x01\xd6\x79\x02\x04\x02\x04\x81\xf6\x04\x81\xf3\x00\xf1\x00" \
"\x76\x00\xa4\xb9\x09\x90\xb4\x18\x58\x14\x87\xbb\x13\xa2\xcc\x67" \
"\x70\x0a\x3c\x35\x98\x04\xf9\x1b\xdf\xb8\xe3\x77\xcd\x0e\xc8\x0d" \
"\xdc\x10\x00\x00\x01\x62\x29\x2c\x11\x14\x00\x00\x04\x03\x00\x47" \
"\x30\x45\x02\x21\x00\xb5\x95\x6a\xe0\xb4\xf9\xe3\x52\x60\x58\xd0" \
"\xc1\x0f\x91\x63\x1e\xfb\xfa\x2d\xb5\x33\x13\xd4\x1a\x62\xcf\x26" \
"\xa2\xab\x7e\xff\x3f\x02\x20\x1e\x1b\xc6\x22\xa1\x03\xf3\x97\x6f" \
"\xdb\x47\x1d\x79\x29\x43\xc0\x15\x61\xf9\x7f\x25\x2c\xdd\x84\xbe" \
"\x1b\xa3\x39\xff\x60\x19\x67\x00\x77\x00\x6f\x53\x76\xac\x31\xf0" \
"\x31\x19\xd8\x99\x00\xa4\x51\x15\xff\x77\x15\x1c\x11\xd9\x02\xc1" \
"\x00\x29\x06\x8d\xb2\x08\x9a\x37\xd9\x13\x00\x00\x01\x62\x29\x2c" \
"\x12\x4c\x00\x00\x04\x03\x00\x48\x30\x46\x02\x21\x00\xff\x59\xe2" \
"\x5d\x97\xc4\xad\x3e\xae\x23\xf8\x48\xe6\x28\xc5\x04\x0e\x87\x80" \
"\xa1\x9b\xc2\xcd\x28\x53\x66\x3a\x14\x73\x0d\x87\xd1\x02\x21\x00" \
"\xbd\x83\xb1\x29\x7b\x27\xcb\xb4\x8e\x30\x26\x4e\x06\xe4\x70\xc3" \
"\x1c\x3a\x82\xd1\x1b\xe7\x96\xfd\xba\xc0\xaa\x07\x74\x5b\x2d\xa3" \
"\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x0b\x05\x00\x03" \
"\x82\x01\x01\x00\x2f\x96\xf5\x9e\x92\x94\xbb\xaf\x56\xb2\x44\x5b" \
"\x77\x1d\x6b\xe1\x89\x35\x42\xec\x00\x2c\x5c\x55\xeb\x4e\xd5\x89" \
"\xe6\x84\x8f\xd1\xeb\x24\xd9\x58\x9e\x83\xd6\x19\x91\x45\xcd\x96" \
"\xcf\xaa\x60\xe8\x3e\x2e\x7b\xf4\x25\x34\x11\x36\x49\x05\xae\x00" \
"\x3b\x1d\x10\x8c\x17\x8d\xd2\x91\x87\xc8\xb8\xa8\xf5\xbc\x28\xed" \
"\xd3\xab\x6e\xe4\x49\xa4\xff\x2c\xe6\x3b\x42\x5e\x16\xc1\x29\x9c" \
"\x7d\xd6\x94\x7e\xe6\x22\x1f\xba\xb1\x1f\x01\x32\x1e\x89\x5a\x9b" \
"\x6e\x69\xa8\x2a\x62\x52\x6b\xeb\x7b\x17\x29\x3d\x3f\xcf\xac\x96" \
"\x92\x4f\xaf\x80\x7f\xff\x39\x2c\xbf\x36\x4f\x43\x5c\x82\xb1\xd8" \
"\x54\xf9\xde\xda\x0a\x00\xeb\x2d\x92\xb2\x45\xd6\x9b\xed\xc2\x93" \
"\x85\xbb\x92\xe0\xab\x04\x38\xbc\x7d\xa4\x88\xf1\x13\x0b\xd0\x59" \
"\x85\x2c\xec\x14\xf9\xe9\x13\xfb\xed\x41\x5f\x3b\x27\x63\x5e\xcb" \
"\x74\x1e\xd8\x6b\xdf\x4e\xd6\xca\xb8\x25\x1c\x17\xdb\xfc\xef\xc4" \
"\xd9\xdd\x6b\xe9\x2e\x2b\x2d\x0b\x58\xc0\x17\x83\x8b\x4f\x89\x04" \
"\x4d\x02\x6e\x5b\x1d\xae\x08\x9f\x93\x3f\x5a\x04\x46\x4e\x40\x74" \
"\x68\xc4\x1b\x97\xa8\x77\xb3\x6a\x74\xb2\x80\xef\xbc\x59\x19\xf9" \
"\x3f\xd0\x44\x6f\x00\x04\x8f\x30\x82\x04\x8b\x30\x82\x03\x73\xa0" \
"\x03\x02\x01\x02\x02\x10\x05\x46\xfe\x18\x23\xf7\xe1\x94\x1d\xa3" \
"\x9f\xce\x14\xc4\x61\x73\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d" \
"\x01\x01\x0b\x05\x00\x30\x61\x31\x0b\x30\x09\x06\x03\x55\x04\x06" \
"\x13\x02\x55\x53\x31\x15\x30\x13\x06\x03\x55\x04\x0a\x13\x0c\x44" \
"\x69\x67\x69\x43\x65\x72\x74\x20\x49\x6e\x63\x31\x19\x30\x17\x06" \
"\x03\x55\x04\x0b\x13\x10\x77\x77\x77\x2e\x64\x69\x67\x69\x63\x65" \
"\x72\x74\x2e\x63\x6f\x6d\x31\x20\x30\x1e\x06\x03\x55\x04\x03\x13" \
"\x17\x44\x69\x67\x69\x43\x65\x72\x74\x20\x47\x6c\x6f\x62\x61\x6c" \
"\x20\x52\x6f\x6f\x74\x20\x43\x41\x30\x1e\x17\x0d\x31\x37\x31\x31" \
"\x30\x36\x31\x32\x32\x33\x34\x35\x5a\x17\x0d\x32\x37\x31\x31\x30" \
"\x36\x31\x32\x32\x33\x34\x35\x5a\x30\x5e\x31\x0b\x30\x09\x06\x03" \
"\x55\x04\x06\x13\x02\x55\x53\x31\x15\x30\x13\x06\x03\x55\x04\x0a" \
"\x13\x0c\x44\x69\x67\x69\x43\x65\x72\x74\x20\x49\x6e\x63\x31\x19" \
"\x30\x17\x06\x03\x55\x04\x0b\x13\x10\x77\x77\x77\x2e\x64\x69\x67" \
"\x69\x63\x65\x72\x74\x2e\x63\x6f\x6d\x31\x1d\x30\x1b\x06\x03\x55" \
"\x04\x03\x13\x14\x47\x65\x6f\x54\x72\x75\x73\x74\x20\x52\x53\x41" \
"\x20\x43\x41\x20\x32\x30\x31\x38\x30\x82\x01\x22\x30\x0d\x06\x09" \
"\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01\x05\x00\x03\x82\x01\x0f\x00" \
"\x30\x82\x01\x0a\x02\x82\x01\x01\x00\xbf\x8a\xd1\x63\x4d\xe1\x18" \
"\xea\x87\x5d\xe8\x16\x3c\x8f\x7f\xb6\xbe\x87\x17\x37\xa4\x0c\xf8" \
"\x31\x3f\x9f\x45\x54\x40\x21\xd7\x9d\x07\x9b\xca\x03\x23\x4a\xbd" \
"\x9b\xed\x85\x02\x63\x3f\x9f\x85\xb9\xec\x28\xef\xf2\x86\x22\xdb" \
"\xf8\x4d\x54\x41\xc5\xb4\x42\x7f\xcf\x33\x17\x01\x0e\x82\x90\x52" \
"\xd3\xc7\x34\xa4\xc1\xa1\x01\xda\x32\xa0\x40\xad\x1f\x59\xe4\x33" \
"\xfc\xa0\xc3\x96\xac\x68\x6c\xd3\xe8\x99\x73\x8c\x26\x10\x77\xcb" \
"\xb7\x3f\x39\x32\xe8\xd2\x59\x28\xee\x07\x86\xe2\x09\x3b\x85\xf8" \
"\xaa\x69\xf6\xa9\x6b\x9f\x58\xad\x72\xc8\x5b\x87\x66\xae\x08\xe0" \
"\x74\xfb\x2d\x53\x43\x62\x83\x3d\x8f\x85\x4c\x11\x97\xdc\x1e\xfc" \
"\x50\x30\xb8\x83\x08\x32\x5e\x5c\x5c\xc4\xe1\x75\x20\x4a\xeb\xa5" \
"\xd6\x75\x2d\xdc\x2d\x7d\x7c\xe0\xd0\xfe\x7c\x75\xa1\x4e\x40\x02" \
"\x84\x9a\xd9\x0d\x5a\x2e\xa0\xac\xf3\x35\x8a\x2a\xea\xd6\x5a\x5a" \
"\x6c\x8e\x2c\xab\xf6\xde\xfd\x78\x47\x26\x79\x7a\xaa\x22\xea\xa9" \
"\xe6\x71\x12\x03\xd3\xf8\xba\x53\xd2\x79\x9c\xbd\x64\xac\xf6\x1b" \
"\x63\xbb\x4d\x8f\x38\x02\xf8\xf0\x57\x5d\xc5\xaa\x25\x5a\x0c\x5d" \
"\xc5\x30\xfe\x20\x53\x19\x6c\xe9\xc3\x02\x03\x01\x00\x01\xa3\x82" \
"\x01\x40\x30\x82\x01\x3c\x30\x1d\x06\x03\x55\x1d\x0e\x04\x16\x04" \
"\x14\x90\x58\xff\xb0\x9c\x75\xa8\x51\x54\x77\xb1\xed\xf2\xa3\x43" \
"\x16\x38\x9e\x6c\xc5\x30\x1f\x06\x03\x55\x1d\x23\x04\x18\x30\x16" \
"\x80\x14\x03\xde\x50\x35\x56\xd1\x4c\xbb\x66\xf0\xa3\xe2\x1b\x1b" \
"\xc3\x97\xb2\x3d\xd1\x55\x30\x0e\x06\x03\x55\x1d\x0f\x01\x01\xff" \
"\x04\x04\x03\x02\x01\x86\x30\x1d\x06\x03\x55\x1d\x25\x04\x16\x30" \
"\x14\x06\x08\x2b\x06\x01\x05\x05\x07\x03\x01\x06\x08\x2b\x06\x01" \
"\x05\x05\x07\x03\x02\x30\x12\x06\x03\x55\x1d\x13\x01\x01\xff\x04" \
"\x08\x30\x06\x01\x01\xff\x02\x01\x00\x30\x34\x06\x08\x2b\x06\x01" \
"\x05\x05\x07\x01\x01\x04\x28\x30\x26\x30\x24\x06\x08\x2b\x06\x01" \
"\x05\x05\x07\x30\x01\x86\x18\x68\x74\x74\x70\x3a\x2f\x2f\x6f\x63" \
"\x73\x70\x2e\x64\x69\x67\x69\x63\x65\x72\x74\x2e\x63\x6f\x6d\x30" \
"\x42\x06\x03\x55\x1d\x1f\x04\x3b\x30\x39\x30\x37\xa0\x35\xa0\x33" \
"\x86\x31\x68\x74\x74\x70\x3a\x2f\x2f\x63\x72\x6c\x33\x2e\x64\x69" \
"\x67\x69\x63\x65\x72\x74\x2e\x63\x6f\x6d\x2f\x44\x69\x67\x69\x43" \
"\x65\x72\x74\x47\x6c\x6f\x62\x61\x6c\x52\x6f\x6f\x74\x43\x41\x2e" \
"\x63\x72\x6c\x30\x3d\x06\x03\x55\x1d\x20\x04\x36\x30\x34\x30\x32" \
"\x06\x04\x55\x1d\x20\x00\x30\x2a\x30\x28\x06\x08\x2b\x06\x01\x05" \
"\x05\x07\x02\x01\x16\x1c\x68\x74\x74\x70\x73\x3a\x2f\x2f\x77\x77" \
"\x77\x2e\x64\x69\x67\x69\x63\x65\x72\x74\x2e\x63\x6f\x6d\x2f\x43" \
"\x50\x53\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x0b\x05" \
"\x00\x03\x82\x01\x01\x00\x30\xf1\x87\x55\x3d\x84\x08\xfc\x2e\x5e" \
"\x6a\xba\x7c\xd2\xcd\xd5\x2c\xe3\xbe\x02\xda\x5d\x89\x77\xed\xf4" \
"\xe9\x56\xc0\x92\xf0\x2a\x55\x2d\x45\xf7\x1c\x2a\x3f\x10\x5b\xf3" \
"\xe9\xe1\xbe\xe1\xe9\x00\x25\xb9\xf7\xa3\xc1\x03\x1b\xe3\x9e\x4e" \
"\x8e\x92\x1b\x09\x95\x52\xf9\xac\x18\xfd\x1f\x29\x01\x8b\x17\x0a" \
"\x73\x34\xf4\x67\x12\x55\xee\x22\xbc\xcb\x30\xca\x80\x99\x3f\xfb" \
"\xcf\x12\x7f\xcb\x3d\x18\x47\x85\xd8\x14\x3e\x4f\x0c\x94\x3f\x7b" \
"\xf5\x11\xa8\x51\x6c\xfb\xa8\x60\x30\xa8\x90\xa1\x8b\x6f\x2e\x45" \
"\xdb\x37\xb6\x1c\x7e\xbd\x16\x59\x21\xb1\x32\x67\xad\x8d\xa3\x4b" \
"\x49\x3f\x3b\x12\x19\x2c\xfc\x9d\x0f\xff\x8c\xff\x01\x23\x0a\xf3" \
"\x04\x05\x07\xe5\x67\x01\x01\xb9\xaf\x81\x67\xeb\x29\xcb\xaf\xf8" \
"\xfc\x86\x3e\xa4\x5c\x73\x84\xf9\xe5\x39\x73\xac\x19\xf3\x03\x36" \
"\x77\xa0\x29\x68\xf5\xf4\xef\x3b\xd3\xee\x88\x73\x0a\xac\x2e\x95" \
"\xea\x68\x22\xd2\xcd\xac\x6b\xf8\x1b\x5e\x53\xc2\x0f\xd6\x76\xe1" \
"\x75\x0c\xc4\x91\x25\xc0\x85\x53\x0e\xe2\x81\xd1\x0e\x18\x30\xc9" \
"\x67\xa4\xdf\xd0\x0a\x12\x78\x07\x40\x05\xb1\x0f\x83\x53\x43\x42" \
"\x3b\xe7\xfb\xf1\x77\xfb\x0c\x00\x01\x8d\x03\x00\x19\x85\x04\x00" \
"\x08\xba\x3d\xb7\xd6\x9c\x42\xa9\x93\xd3\xb0\x82\x2a\x9c\x16\x97" \
"\x7d\x39\x8f\xb0\xb0\xb5\xc3\x82\x36\x30\xc7\x6c\x50\xdb\xdd\x29" \
"\x1b\x27\x9b\x82\x29\xed\x74\x85\xef\xd5\xb0\x82\x45\xb1\xcc\x49" \
"\xef\x9b\x8c\xb2\x03\xe8\xba\xec\x55\x6a\x81\x7b\xa0\x5a\xf3\x42" \
"\xc2\x01\x4a\x73\x78\xe8\xec\xbc\x3e\x7a\x68\x83\x32\xe0\xfc\x2a" \
"\x0d\xa7\x50\x00\xea\x5f\x12\x8b\x68\xce\x01\x79\x82\x5b\xad\x4f" \
"\xd8\xe0\xa8\x2a\xae\x5f\x1b\x05\x34\x17\xb6\x7d\x32\xa9\xf7\xc1" \
"\x85\x6f\xed\xc0\x84\x1a\x8e\xdb\xde\xad\xbd\xa9\x93\xe1\x3e\xb7" \
"\x17\x33\x87\x02\x01\x01\x00\x4e\xb8\x1f\x24\x3a\xbd\x8b\xc0\xdc" \
"\x2e\xe8\x0e\xb2\x10\xcd\x56\x2e\x0d\xc4\x27\xe5\x11\x4d\x1b\x20" \
"\x51\x93\x60\x22\x8b\xfe\x23\x19\x26\x3d\x1d\x50\x69\x8b\x0d\x6e" \
"\xc9\xcd\xa1\x78\x0c\x8e\x85\x3c\xc4\x91\xbe\xee\x06\xb5\x09\x73" \
"\x14\xe9\x35\x3b\xe9\x13\xc3\x34\xcd\xf8\x48\x38\x2d\x7f\xb7\xa7" \
"\x6b\x1f\x98\x85\xd6\xe2\xa8\x6c\x5f\xe4\x00\x44\xf9\x4c\x0c\x32" \
"\x81\x81\x00\x05\x13\xff\x61\x89\x96\x91\x26\x1b\x42\x55\xe2\xd6" \
"\xbe\x26\x8e\x45\x27\x32\x56\x4a\xbf\xeb\xf0\x3c\x1e\xcd\x19\x65" \
"\x8b\xb4\x2c\xe7\x64\xa4\xf6\xc7\x54\x78\x07\xd0\xf0\xb2\x8d\x85" \
"\xdc\x2b\x41\xb9\xb9\x61\x48\x1c\x10\x88\x2a\xdf\x4c\x89\xa1\x2d" \
"\x52\xc9\x7d\x93\xc1\x21\x37\x40\x71\x32\x2f\x9f\xb5\xff\xc2\x5c" \
"\x27\xa6\x58\xc8\xf1\x57\xf4\x72\xe0\x2c\xc5\xd0\x9b\x06\xb3\xf8" \
"\x2b\xc5\x44\x5e\xfe\x8d\x70\xb5\x4e\x1e\xe1\x6c\x53\xee\xbd\x05" \
"\xd3\xe6\x66\xce\x24\xfb\x62\xd9\x58\x2e\xd5\x86\xc9\xe9\xfa\xe3" \
"\xc9\xa9\x71\xac\x65\x29\xc9\x60\xeb\x4b\x49\x3e\xdb\x3b\x72\x9b" \
"\x4b\xfc\x09\xcd\xda\xc1\x60\x7d\x4b\x8f\x02\x27\x70\x63\xcc\x3e" \
"\x69\x88\x64\x3d\x80\xa0\xe7\x0e\x00\x00\x00";

static void test_tls_long_rec()
{
    fftls t = {};

    fftls_input(&t, tls_long_rec, FFSLEN(tls_long_rec));
    x(FFTLS_RSERVER_HELLO == fftls_read(&t));

    x(FFTLS_RCERT == fftls_read(&t));
    x(FFTLS_RKEY_EXCH == fftls_read(&t));
    x(FFTLS_RSERV_HELLO_DONE == fftls_read(&t));
    x(FFTLS_RDONE == fftls_read(&t));
}
